#include <Python.h>
#include <iostream>

int main(int argc, char* argv[]) 
{
    // 检查命令行参数数量
    if (argc < 3) {
        std::cerr << "Usage: pureEmbedding pythonfile funcname [args]\n";
        return 1;
    }

    // 初始化 Python 解释器
    Py_Initialize();

    // 检查初始化是否成功
    if ( !Py_IsInitialized() ) {
        std::cerr << "Error initializing Python interpreter.\n";
        return 1;
    }

    // 将当前目录添加到 Python 的 sys.path，以便导入同目录下的模块
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append(\".\")"); // 注意：生产环境应使用更安全的方式处理路径

    // 将第一个命令行参数作为模块名
    PyObject* pName = PyUnicode_DecodeFSDefault(argv[1]);
    if (!pName) {
        PyErr_Print(); // 打印 Python 错误信息
        std::cerr << "Failed to decode module name.\n";
        Py_Finalize();
        return 1;
    }

    // 导入模块
    PyObject* pModule = PyImport_Import(pName);
    Py_DECREF(pName); // 释放对模块名字符串的引用

    if (pModule != NULL) {
    // 将第二个命令行参数作为函数名
    PyObject* pFunc = PyObject_GetAttrString(pModule, argv[2]);

    if (pFunc && PyCallable_Check(pFunc)) {
        // 构建传递给 Python 函数的参数元组
        PyObject* pArgs = PyTuple_New(argc - 3);
        for (int i = 0; i < argc - 3; ++i) {
        // 将命令行参数转换为 Python 长整型
        PyObject* pValue = PyLong_FromLong(std::atoi(argv[i + 3])); // 使用 std::atoi
        if (!pValue) {
            Py_DECREF(pArgs);
            Py_DECREF(pModule);
            PyErr_Print();
            std::cerr << "Cannot convert argument to Python long.\n";
            Py_Finalize();
            return 1;
        }
        // PyTuple_SetItem 偷取 pValue 的引用，不需要 Py_DECREF(pValue)
        PyTuple_SetItem(pArgs, i, pValue);
        }

        // 调用 Python 函数
        PyObject* pValueResult = PyObject_CallObject(pFunc, pArgs);
        Py_DECREF(pArgs); // 释放参数元组的引用

        if (pValueResult != NULL) {
        // 处理返回值 (期望是一个长整型)
        if (PyLong_Check(pValueResult)) {
                long result = PyLong_AsLong(pValueResult);
                std::cout << "Result of call: " << result << std::endl;
        } else {
                std::cerr << "Python function returned a non-long value.\n";
                // 可以尝试打印其他类型的返回值，例如字符串 PyUnicode_AsUTF8
        }
        Py_DECREF(pValueResult); // 释放返回值引用
        }
        else {
        Py_DECREF(pFunc); // 释放函数引用 (如果调用失败，Py_XDECREF 是安全的)
        Py_DECREF(pModule); // 释放模块引用
        PyErr_Print(); // 打印 Python 错误信息
        std::cerr << "Python function call failed.\n";
        Py_Finalize();
        return 1;
        }
    }
    else {
        if (PyErr_Occurred())
        PyErr_Print();
        std::cerr << "Cannot find callable function \"" << argv[2] << "\" in module \"" << argv[1] << "\".\n";
    }
    Py_XDECREF(pFunc); // 安全释放函数引用
    Py_DECREF(pModule); // 释放模块引用
    }
    else {
    PyErr_Print(); // 打印导入错误信息
    std::cerr << "Failed to load module \"" << argv[1] << "\".\n";
    Py_Finalize();
    return 1;
    }

    // 清理和关闭 Python 解释器
    Py_Finalize();

    return 0;
}